import re

from users.models import User


def jwt_response_payload_handler(token, user=None, request=None):
    """
    自定义jwt认证成功返回数据

    token 就是 jwt生成的token
    user  就是的登陆之后的user  是 User的实例对象
    """
    return {
        'token': token,
        'user_id': user.id,
        'username': user.username
    }


"""
产品需求：用户不仅需要用户名登陆，也要用手机号登陆

1、我们需要重写 认证后端
2、我们需要在认证的后端中，判断用户输入的是手机号还是用户名

"""

"""
抽取（封装）
目的：解耦
原则：
    ①部分代码实现了一个小功能
    ②重复性的代码
步骤：
    ①定义一个方法，将要抽取的代码复制到这个方法中
    ②复制的代码，哪里有问题改哪里，缺少的变量以参数的形式定义
    ③验证成功之后，再将抽取的代码删除


"""
from django.contrib.auth.backends import ModelBackend
#用户名登陆，手机号登陆
def get_user_by_account(username):
    try:
        if re.match(r'1[3-9]\d{9}', username):
            # 手机号
            user = User.objects.get(mobile=username)

        else:
            # 用户名
            user = User.objects.get(username=username)

    except User.DoesNotExist:
        return None

    return user



class UsernameMobileModelBackend(ModelBackend):

    def authenticate(self, request, username=None, password=None, **kwargs):
        #1、判断用户输入的是手机号还是用户名
        # try:
        #     if re.match(r'1[3-9]\d{9}',username):
        #         #手机号
        #         user = User.objects.get(mobile=username)
        #
        #     else:
        #         #用户名
        #         user = User.objects.get(username=username)
        #
        # except User.DoesNotExist:
        #     return None

        user = get_user_by_account(username)

        #2、查询出用户信息之后，只需要 根据密码验证一下就可以了

        if user is not None and user.check_password(password):
            return user
        else:
            return None




























